//------------------------------------------------------//
// sendTextFile.c
// renome le fichier
// envoi le contenu du fichier texte par le reseau
// supprime le fichier
//-----------------------------------------------------//
// Auteur : Brondino Julien
// Date de dernière modification : 04-04-2007
//-----------------------------------------------------//

#include "libreseau.h"

#define LISTEN 1        /* Nombre maxi de connexions acceptées */
#define NOUV_FICH "temp"

int main(int argc, char** argv){
  int sockfd, newfd, pid, port, length;
  FILE *f;
  char chaine[20],*fichier;

  // teste les paramètres qui doivent être le nom du fichier et le numéro de port
  if(argc!=3){
      fprintf(stderr,"usage: %s nom_fichier num_port\n",argv[0]);
      exit(-1);
  }
  port=atoi(argv[2]);
  fichier=argv[1];
  // On crée notre serveur avec le mode débuggage actif pour voir ce qui se passe.
  sockfd = creer_serveur_tcp (port, LISTEN, 1);

  // On vérifie que l'on a bien pu créer le serveur
  if(sockfd == -1){
    perror("sendTextFile: Port deja utilise");
    exit(-1);
  }

  // On rentre dans une boucle infinie d'attente des clients
  while(1){
    newfd = attendre_client_tcp (sockfd, 1);

    // Dès qu'un client se connecte, on crée un processus (Thread) pour le gérer //
    pid = fork();
    // On s'occupe du fils //
    if (pid == 0) { /* processus fils */
      if (rename(fichier,NOUV_FICH)==-1){
          perror("sendTextFile: échec renomage du fichier");
      }
      if ((f=fopen(NOUV_FICH,"rt"))==-1){
          perror("sendTextFile: echec ouverture fichier");
      }
      while((length = fread(chaine,sizeof(char),10,f)) != 0) {
        if (ecrire(newfd, length, chaine) == -1){
            perror("sendTextFile: echec de l'envoi");
        }
      }
      fclose(f);
      if (remove(NOUV_FICH)==-1){
          perror("sendTextFile: échec suppresion du fichier");
      }
      // On a tout envoyé, donc on ferme la socket et on quitte le processus
      close(newfd);
      exit(0);
    }
    close(newfd);                      /* Le père continue son petit travail */
    while(waitpid(-1,NULL,WNOHANG) > 0); /* Nettoyage des processus fils */
  }
}
